package com.example.pt.controller;

import com.auth0.jwt.interfaces.DecodedJWT;
import com.example.pt.dto.RecommendationFeedbackDTO;
import com.example.pt.enums.FeedbackType;
import com.example.pt.service.RecommendationFeedbackService;
import com.example.pt.utils.JWTUtil;
import com.example.pt.utils.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * 推荐反馈控制器
 * 处理用户对推荐内容的反馈
 */
@RestController
@RequestMapping("/api/recommendation/feedback")
@CrossOrigin(origins = "*")
public class RecommendationFeedbackController {
    
    private static final Logger logger = LoggerFactory.getLogger(RecommendationFeedbackController.class);
    
    @Autowired
    private RecommendationFeedbackService feedbackService;
    
    /**
     * 提交不感兴趣反馈
     * @param feedbackDTO 反馈信息
     * @param header 请求头（包含token）
     * @return 处理结果
     */
    @PostMapping("/dislike")
    public ResponseEntity<?> submitDislikeFeedback(
            @RequestBody RecommendationFeedbackDTO feedbackDTO,
            @RequestHeader Map<String, String> header) {
        
        try {
            // 验证Token获取用户ID
            Integer userId = getUserIdFromToken(header);
            if (userId == null) {
                return ResponseEntity.ok(Result.fail("请先登录"));
            }
            
            // 验证必要参数
            if (feedbackDTO.getTorrentId() == null) {
                return ResponseEntity.ok(Result.fail("缺少种子ID参数"));
            }
            
            // 设置反馈类型为"不感兴趣"，如果未指定
            if (feedbackDTO.getFeedbackType() == null) {
                feedbackDTO.setFeedbackType(FeedbackType.NOT_INTERESTED.getValue());
            }
            
            // 添加反馈
            boolean success = feedbackService.addFeedback(userId, feedbackDTO);
            
            if (success) {
                logger.info("用户 {} 成功提交对种子 {} 的不感兴趣反馈", userId, feedbackDTO.getTorrentId());
                return ResponseEntity.ok(Result.success("反馈提交成功"));
            } else {
                logger.warn("用户 {} 提交对种子 {} 的不感兴趣反馈失败", userId, feedbackDTO.getTorrentId());
                return ResponseEntity.ok(Result.fail("反馈提交失败"));
            }
        } catch (Exception e) {
            logger.error("处理不感兴趣反馈时发生错误: {}", e.getMessage(), e);
            return ResponseEntity.ok(Result.fail("处理反馈时发生错误"));
        }
    }
    
    /**
     * 从请求头中获取用户ID
     * @param header 请求头
     * @return 用户ID，如果未登录则返回null
     */
    private Integer getUserIdFromToken(Map<String, String> header) {
        // 尝试从两种可能的请求头中获取token
        String token = header.get("token"); // 自定义token头
        
        // 如果没有找到token头，尝试从Authorization头获取
        if ((token == null || token.isEmpty()) && header.containsKey("authorization")) {
            String authHeader = header.get("authorization");
            // 检查是否是Bearer token格式
            if (authHeader != null && authHeader.startsWith("Bearer ")) {
                // 提取实际的token值(去掉"Bearer "前缀)
                token = authHeader.substring(7);
            }
        }
        
        if (token != null && !token.isEmpty()) {
            try {
                DecodedJWT decodedJWT = JWTUtil.verifyToken(token);
                return decodedJWT.getClaim("uid").asInt();
            } catch (Exception e) {
                logger.warn("Token验证失败: {}", e.getMessage());
                return null;
            }
        }
        
        return null;
    }
    
    /**
     * 获取反馈类型列表
     * @return 反馈类型列表
     */
    @GetMapping("/types")
    public ResponseEntity<?> getFeedbackTypes() {
        Map<String, Object> types = new HashMap<>();
        
        for (FeedbackType type : FeedbackType.values()) {
            Map<String, Object> typeInfo = new HashMap<>();
            typeInfo.put("value", type.getValue());
            typeInfo.put("description", type.getDescription());
            types.put(type.name(), typeInfo);
        }
        
        return ResponseEntity.ok(Result.success(types, "获取反馈类型成功"));
    }
} 